package com.company.oa.common.util;

import com.company.oa.common.exception.BusinessException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * 文件工具类
 */
public class FileUtil {

    /**
     * 上传文件
     *
     * @param file 文件
     * @param uploadPath 上传路径
     * @param maxFileSize 最大文件大小（字节）
     * @return 文件相对路径
     */
    public static String upload(MultipartFile file, String uploadPath, long maxFileSize) {
        // 检查文件大小
        if (file.getSize() > maxFileSize) {
            throw new BusinessException("文件大小超过限制");
        }
        
        // 获取文件后缀
        String originalFilename = file.getOriginalFilename();
        String suffix = "";
        if (originalFilename != null && originalFilename.contains(".")) {
            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        }
        
        // 生成新文件名
        String fileName = UUID.randomUUID().toString() + suffix;
        
        // 创建目标目录
        File targetDir = new File(uploadPath);
        if (!targetDir.exists()) {
            targetDir.mkdirs();
        }
        
        // 保存文件
        try {
            Path targetPath = Paths.get(uploadPath, fileName);
            Files.copy(file.getInputStream(), targetPath);
            return fileName;
        } catch (IOException e) {
            throw new BusinessException("文件上传失败");
        }
    }
    
    /**
     * 删除文件
     *
     * @param filePath 文件路径
     * @return 是否删除成功
     */
    public static boolean delete(String filePath) {
        try {
            Path path = Paths.get(filePath);
            return Files.deleteIfExists(path);
        } catch (IOException e) {
            return false;
        }
    }
    
    /**
     * 获取文件类型
     *
     * @param fileName 文件名
     * @return 文件类型
     */
    public static String getFileType(String fileName) {
        if (fileName == null || !fileName.contains(".")) {
            return "";
        }
        return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
    }
    
    /**
     * 检查文件类型是否允许
     *
     * @param fileName 文件名
     * @param allowedTypes 允许的文件类型
     * @return 是否允许
     */
    public static boolean isAllowedType(String fileName, String[] allowedTypes) {
        if (fileName == null || allowedTypes == null || allowedTypes.length == 0) {
            return false;
        }
        
        String fileType = getFileType(fileName);
        for (String type : allowedTypes) {
            if (type.equalsIgnoreCase(fileType)) {
                return true;
            }
        }
        
        return false;
    }

    /**
     * 获取文件扩展名
     *
     * @param fileName 文件名
     * @return 文件扩展名（不包含点号）
     */
    public static String getFileExtension(String fileName) {
        if (fileName == null || fileName.isEmpty() || !fileName.contains(".")) {
            return "";
        }
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    /**
     * 上传文件
     *
     * @param file 文件
     * @param uploadPath 上传路径
     * @return 文件相对路径
     * @throws IOException IO异常
     */
    public static String uploadFile(MultipartFile file, String uploadPath) throws IOException {
        // 获取文件后缀
        String originalFilename = file.getOriginalFilename();
        String suffix = "";
        if (originalFilename != null && originalFilename.contains(".")) {
            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        }
        
        // 生成新文件名
        String fileName = UUID.randomUUID().toString() + suffix;
        
        // 创建目标目录
        File targetDir = new File(uploadPath);
        if (!targetDir.exists()) {
            targetDir.mkdirs();
        }
        
        // 保存文件
        Path targetPath = Paths.get(uploadPath, fileName);
        Files.copy(file.getInputStream(), targetPath);
        
        // 返回相对路径
        return fileName;
    }
}